<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>原型链</title>
</head>
<body>
<h3>原型链</h3>
<p>
    基于原型对象的继承,使得不同构造函数的原型对象关联在一起， <br>
    并且这种关联的关系是一种链状的结构，我们将原型对象的,链状结构关系称为 原型链
</p>
<img src="./原型链.png" alt="">
<h3>原型链-查找规则</h3>
<p>
    ① 当访问一个对象的属性（包括方法）时，首先查找这个对象自身有没有该属性。 <br>
    ② 如果没有就查找它的原型（也就是 __proto__指向的 prototype 原型对象） <br>
    ③ 如果还没有就查找原型对象的原型（Object的原型对象） <br>
    ④ 依此类推一直找到 Object 为止（null） <br>
    ⑤ __proto__对象原型的意义就在于为对象成员查找机制提供一个方向，或者说一条路线 <br>
    ⑥ 可以使用 instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链
</p>
<p>
    个人理解: 原型链 和作用域链很像 <br>
    一层一层查找 原型对象, 直到最大的 Object, 就没有原型对象了
</p>
<hr>
<a href="https://www.bilibili.com/video/BV1Y84y1L7Nn/?p=184&spm_id_from=pageDriver&vd_source=cb928a955f1123af004a2e3158113ea7">
    视频讲解: JS进阶 183-原型链
</a>


<script>
    function 人类() {
        // 声明一个,构造函数
    }

    // 实例化 对象
    const 海燕 = new 人类()
    console.log(海燕.__proto__ === 人类.prototype) // true, 证明对象里的 原型对象 指向, 构造函数的 原型对象
    console.log(人类.prototype.__proto__ === Object.prototype) // true, 证明构造函数的 原型对象 指向,Object的 原型对象
    // Object是最大的对象

    // Object 是最大的, 所有的对象都是归属 Object, 所以原型对象的指向没有了 null
    console.log(Object.prototype.__proto__) // null



    // instanceof 运算符 (简单理解它,属不属于 另外一个构造函数)
    console.log(海燕 instanceof 人类) // true,
    console.log(海燕 instanceof Object) // true
    console.log(海燕 instanceof Array) // false, 不属于Array
</script>

</body>
</html>